// 用于比较基本数据类型、数组、对象是否相等
function deepEqual(a, b) {
    // 如果 a 和 b 是严格相等的（包括基本数据类型和引用相同的对象/数组），则直接返回 true
    if (a === b) {
        return true;
    }
    // 处理 Number.NaN 的情况，因为 NaN !== NaN
    if (Number.isNaN(a) && Number.isNaN(b)) {
        return true;
    }
    // 如果 a 和 b 都是数组，则递归地比较它们的元素
    if (Array.isArray(a) && Array.isArray(b)) {
        for (let i = 0; i < a.length; i++) {
            if (!deepEqual(a[i], b[i])) {
                return false;
            }
        }
        return true;
    }
    // 如果 a 和 b 都是对象（并且不是数组），则递归地比较它们的属性
    if (typeof a === 'object' && typeof b === 'object') {
        const keysA = Object.keys(a);
        const keysB = Object.keys(b)
        // 检查 a 和 b 是否有相同的键，并且对应的值是否相等
        for (let key of keysA) {
            if (!keysB.includes(key) || !deepEqual(a[key], b[key])) {
                return false;
            }
        }
        return true;
    }
    // 如果以上情况都不满足，则返回 false
    return false;
}

// 测试用例
console.log(deepEqual(1, 1)); // true
console.log(deepEqual(1, '1')); // false
console.log(deepEqual([1, 2, 3], [1, 2, 3])); // true
console.log(deepEqual({a: 1, b: 2}, {b: 2, a: 1})); // true
console.log(deepEqual({a: 1, b: [1, 2, {c: 3}]}, {a: 1, b: [1, 2, {c: 3}]})); // true
console.log(deepEqual({a: 1, b: [1, 2, {c: 4}]}, {a: 1, b: [1, 2, {c: 3}]})); // false
